package com.lmf.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.lmf.vo.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

/**
 *  @Controller:创建处理器对象，对象放在springmvc容器中
 *  使用位置：在类的上面
 *  与spring框架中的用法一样
 */
@Controller
public class Mycontroller {

    /**
     * 处理器方法返回String---表示逻辑视图名称，需要配置视图解析器
     */
    @RequestMapping(value = "/returnString-view.do")
    public String doReturnView(HttpServletRequest request,String name,Integer age) throws IOException {
        System.out.println("学生姓名："+name+"，学生年龄："+age);
        //手动添加数据到request作用域中
        request.setAttribute("name",name);
        request.setAttribute("age",age);
//        PrintWriter writer = response.getWriter();
//        writer.println("你好，刘明福！");

        //show:逻辑视图名称，项目中配置了视图解析器
        //框架对视图执行forward转发操作
        return "show";
    }

    /**
     * controller方法返回String表示视图完整路径名称
     */
    @RequestMapping(value = "/returnString-view2.do")
    public String doReturnView2(HttpServletRequest request,String name,Integer age){
        System.out.println("学生姓名："+name+"，学生年龄："+age);
        //手动添加数据到request作用域中
        request.setAttribute("name",name);
        request.setAttribute("age",age);

        //show:表示完整视图路径名称，不能配置视图解析器，否则报错
        //框架对视图执行forward转发操作
        return "/WEB-INF/view/show.jsp";
    }

    /**
     * 返回值是void的情况
     */
    @RequestMapping(value = "/returnVoid-ajax.do")
    public void doReturnVoidAjax(HttpServletResponse response,String name,Integer age) throws IOException {
        System.out.println("学生姓名："+name+"，学生年龄："+age);
//        处理ajax，使用json做数据的格式
//        service调用完成了。使用Student表示处理结果
        Student student=new Student(name,age);
        String json="";

        //把处理结果转换为json字符串格式
        if (student != null) {
            //使用ObjectMapper类的writeValueAsString方法，将student对象转换为json字符串格式
            ObjectMapper om=new ObjectMapper();
            json = om.writeValueAsString(student);
            System.out.println("student转换为json数据为："+json);
        }

        //输出数据，响应ajax请求
        response.setContentType("Application/json;charset=utf-8");
        PrintWriter writer = response.getWriter();
//        writer.write("中文字符");
        writer.println(json);//输出json字符串
        writer.flush();//刷新
        writer.close();//关闭输出流
    }

    /**
     * 返回一个对象student，通过框架转换为json格式，响应ajax请求
     * @ResponseBody:
     *      作用：把处理器方法返回对象转为json后，通过HttpServletResponse输出给浏览器
     *      位置：方法的定义上面，和其他注解没有顺序关系
     *      前提：在配置文件中开启注解驱动 。即，加上这行代码 ： <mvc:annotation-driven/>
     */
    @RequestMapping(value = "/returnStudent-ajax.do")
    @ResponseBody
    public Student doReturnStudentAjax(String name,Integer age){
        //调用service处理请求，把处理结果转为一个对象存储
        Student student=new Student("李四同学",21);

        return student;//框架会自动转换student为json数据
    }

    /**
     * 返回值是一个对象集合
     * @param name
     * @param age
     * @return
     */
    @RequestMapping(value = "/returnStudentList-ajax.do")
    @ResponseBody
    public List<Student> doReturnStudentListAjax(String name, Integer age){
        List<Student> list=new ArrayList<>();
        Student student=new Student("李四同学",21);
        list.add(student);
        student=new Student("张三",22);
        list.add(student);
        return list;    //框架会自动转换student集合为json数据的数组
    }

    /**
     * 返回String，string表述数据，不是视图
     *  1.区分String表示的数据与视图的方法：有@ResponseBody表示是数据； 没有@ResponseBody表示是视图
     *  2.原本框架默认使用的是：“text/plain;charset=ISO-8859-1”,这样会导致中文乱码，
     *      解决方案：给@RequestMapping注解中再加一个produces属性值，用来指定新的charsetType;
     * @param name
     * @param age
     * @return
     */
    @RequestMapping(value = "/returnString-ajax.do",produces = "text/plain;charset=utf-8")
    @ResponseBody
    public String doReturnStringAjax(String name, Integer age){
        return "张三喜欢里尔";
    }

}
